package com.ycz.algorithm.utils.arrays;

import java.util.Arrays;
import java.util.concurrent.ThreadLocalRandom;

/**
 * @author yancz
 * @ClassName ArrayUtil
 * @description: TODO
 * @date 2024-11-13 16:49:17
 * @version: 1.0
 */
public class ArrayUtil {

    public static void main(String[] args) {
        int[] arrs = {1, 2, 3, 4, 5};
        System.out.println(randomAccess(arrs));
        int[] newArrays = insertElement(arrs, 6, 2);
        for (int i : newArrays) {
            System.out.print(i + "\t");
        }
        System.out.println("\n");
        int[] newArrays2 = deleteElement(arrs, 2);
        for (int i : newArrays2) {
            System.out.print(i + "\t");
        }
        System.out.println();
        traverseArray(arrs);
        System.out.println("4的索引：" + findElement(arrs, 4));
        int[] extendsArray = extendArrays(arrs,10);
        for (int i : extendsArray) {
            System.out.print(i + "\t");
        }
    }

    // 访问数组元素
    static int randomAccess(int[] nums) {
        int index = ThreadLocalRandom.current().nextInt(0, nums.length); // 随机获取数组索引
        return nums[index];
    }

    /*
     * @author yancz
     * @description 数组中插入元素
     * @date 2024/11/13 16:58
     * @param nums 数组
     * @param num  待插入的元素
     * @param index  插入元素的位置索引
     **/
    static int[] insertElement(int[] nums, int num, int index) {
        // 扩容原数组
        int[] copyArrs = Arrays.copyOf(nums, nums.length + 1);
        for (int i = copyArrs.length - 1; i > index; i--) { // 插入位置后的所有元素后移一位
            copyArrs[i] = copyArrs[i - 1];
        }
        copyArrs[index] = num; // 元素插入
        return copyArrs;
    }

    /*
     * @author yancz
     * @description 数组中删除元素
     * @date 2024/11/13 17:17
     * @param nums 数组
     * @param index
     * @return int[]
     **/
    static int[] deleteElement(int[] nums, int index) {
        for (int i = index; i < nums.length - 1; i++) { // 删除位置后的所有元素前移一位，末尾元素值变为0，截断
            nums[i] = nums[i + 1];
        }
        return Arrays.copyOf(nums, nums.length - 1);
    }

    // 遍历数组：两种方式，1. 通过索引 2. forEach直接遍历
    static void traverseArray(int[] arrs) {
        System.out.println("索引遍历============>");
        for (int i = 0; i < arrs.length; i++) {
            System.out.print(arrs[i] + "\t");
        }
        System.out.println();
        System.out.println("foreach遍历============>");
        for (int i : arrs) {
            System.out.print(i + "\t");
        }
        System.out.println();
    }

    /*
     * @author yancz
     * @description 数组中查找元素，找到返回索引，找不到返回-1
     * @date 2024/11/14 17:05
     * @param nums
     * @param target
     * @return int
     **/
    static int findElement(int[] nums, int target) {
        for (int i = 0; i < nums.length; i++) {
            if (target == nums[i]) {
                return i;
            }
        }
        return -1;
    }

    /*
     * @author yancz
     * @description 数组扩容
     * @date 2024/11/14 17:20
     * @param nums 原数组
     * @param size 需要扩大的大小
     * @return int[] 返回的新数组
     **/
    static int[] extendArrays(int[] nums, int size) {
        int[] res = new int[nums.length + size];
        for (int i = 0; i < nums.length; i++) {
            res[i] = nums[i];
        }
        return res;
    }

}
